// TODO: 匿名函数&Lambda笔记
// DATE: 2022/3/17
// AUTHOR: Cheng Ze WUST

fun main(args: Array<String>){
//region 匿名函数之.count
    val len="Cheng".count() //返回字符长度
    println(len)

    val lenn="abccnnnfr".count(){    //能拿到每一个字符给it
        it=='n'
    }
    println(lenn)
//endregion

//region 函数类型&隐式返回
    //第一步：函数输入输出的声明
    val methodAction:()->String
    //第二步：对上面函数的实现
    methodAction={
        val str="233"
        //匿名函数返回值不加return，直接返回最后一行
        "cheng $str"
    }
    println(methodAction())
//endregion

//region 函数参数
    //第一步：函数输入输出的声明 第二步：对上面函数的实现
    val gitSum:(Int,Int,Int)->String={ a,b,c->
        val sum=a+b+c
        "$a+$b+$c=$sum"
    }
    println(gitSum(3,5,8))
//endregion

//region it关键字
    val metho1:(String)->String={"$it++"}
    //如果只有一个参数则默认为it
    println(metho1("233"))
//endregion

//region 匿名函数类型自动推断
    //方法名:必须指定参数类型和返回类型
    //val metho2:()->String={}
    //方法名=类型推断返回值
    val metho2={v1:Int,v2:String->
        "$v1,$v2"   //自动推断为String返回类型
    }
    println(metho2(16,"Miky"))
//endregion

//region lambda
    //匿名函数 == lambda表达式
    val addSum={a:Int,b:Int->
        "两数相加结果为${a+b}"
    }
    println(addSum(3,10))
//endregion

//region 函数引用
    login("Cheng",123456,::methodResponseResult)    //具名函数
    //lambda属于函数类型的对象，需要把methodResponseResult普通函数转换成函数类型的对象(::)
//endregion

//region 函数类型作为返回类型
    fun show(info:String):(String,Int)->String{
        println("info:$info")
    //return一个匿名函数
        return {name:String,age:Int->
            "---$name,$age"
        }
    }
    val showm=show("122")   //此时showm相当于匿名函数
    println(showm("Cheng",23))
//endregion

//region


//endregion

}

//region 函数内联
//如果函数有使用lambda作为参数则需要声明内联，否则会生成多个对象造成性能损耗
//使用内联相当于C++的#define宏定义，会把代码替换到调用处
inline fun login(name:String,pwd:Int,responseResult:(String,Int)->Unit){
    if ("Cheng"==name && 123456==pwd){
        responseResult("登陆成功",200)
    }else
        responseResult("登陆失败",444)
}

fun methodResponseResult(msg:String,code:Int){
    println("--$msg,$code")
}
//endregion







